這篇筆記主要整理自此部 2022/5 YT 影片:TypeScript Tutorial for Beginners - Programming with Mosh
*以下 TypeScript 簡稱 TS
*以下使用的 editor 為 VScode
*VScode 裡跳的錯誤提示(毛毛蟲)這裡簡稱「跳錯」
創造客製化的 type
使用 Type aliases 可以解決什麼問題?
前一篇在介紹 objects 時,寫了這個範例:
let employee: {
id: number;
name: string;
} = { id: 1, name: "Kim" };
以上三個問題 type aliases 可以解決!
範例
// 寫好 type aliases
type Employee = {
id: number;
name: string;
};
// 下面註釋時就可以用型別別名,簡潔多了還可以重複用!
let employee1: Employee = { id: 1, name: "Kim" };
let employee2: Employee = { id: 1, name: "Kate" };
|
,很像 or 的概念承接上方的 code,使用 if/else 來過濾型別:
上方的 if block 中 TS 可以推斷出那個參數是 number,下方就是剩下的 string(跳出來的可用 methods or properties 也會隨之改變),這樣的行為就叫 type Narrowing
&
,很像 and 的概念type Draggable = {
drag: () => void;
};
type Resizable = {
resize: () => void;
};
// 此處使用 intersection,代表新的 type UIWidget 要同時符合右邊兩個
type UIWidget = Draggable & Resizable;
const textBox: UIWidget = {
drag: () => {},
resize: () => {},
};
"strictNullChecks": true
雖然沒有打開,但它 enable by default,會阻擋把 null 帶入函式中,如果打開改成 false
就可以把 null 帶進去,但通常不太會這麼做null
就不會跳錯了
function log(something: string | null) {
console.log(something);
}
log(null); // 因為上面註釋有寫可以是 null 就沒有跳錯 ✅
?.
有時我們無法確定某個變數是否「不是 null or undefined」,如果我們試著讀取該變數的 property, [index] 或是 call 它,如果它剛好是「null or undefined」程式執行就會出現 error,這時可以使用 ?.
做檢查,如果他不存在,就會直接回傳 undefined 而不是出現 error
// customer 有可能是 null/undefined 或 object
customer.birthday // 跳錯,過去在 JS 就是等跑程式碼時才知道有沒有 error
customer?.birthday // ✅ 使用 optional property access operator
// customers 有可能是 null/undefined 或 array
customers[0] // 跳錯
customers?.[0] // ✅ 使用 optional element access operator
// log 有可能是 null/undefined 或 funciton
log('a') // 跳錯
log?.('a') // ✅ 使用 optional call,log 是 function 才會 call,不然回傳 undefined
ex. unknown, never...
在寫 object 的註釋時,寫了裡面的 method,但它不會真的影響到「創建 method 的 code」,倒是會影響到「呼叫它的 code」,我暫時覺得有點不一致,但也有可能繼續往下學會有解答?因為得知目前的註釋寫法算是為「變數」寫的,還有寫在「function 本人」身上的,不知道看到這邊的大大們對這個疑惑有什麼看法?(以下為 code)
let employee: {
readonly id: number;
name: string;
fn: (num: number) => void; // 1. annotation 寫在這
} = {
id: 1,
name: "Kim",
fn: () => { // 3. 但這裡實則沒要求放入參數,連回傳值也並非 void
return 2;
},
};
employee.fn(1); // 2. 這邊會因為上面的 annotation 而要求我寫參數
以上,有任何想法或文內有誤、不清楚歡迎提出,謝謝大家 🙏🏻
.
筆者小記:覺得 TS 的型別推斷有夠聰明!然後 Mosh 一小時的課真的是很精實,作為 overview 還滿不錯的,筆者接著會持續透過其他資源學習,有機會再分享筆記上來交流~~~